package com.pro.api;


import com.pro.VO.SignVo;
import com.pro.bean.Sign;
import com.pro.dto.Dto;
import com.pro.service.SignService;
import com.pro.service.UserInfoService;
import com.pro.util.dtoUtil.DtoUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * 提供前端接口，供前端访问
 * 当前类为Sign控制层
 *
 * 刘永康
 **/
@RestController
@RequestMapping("sign")
public class SignController {
       //注入SignService服务层
    @Autowired
    private SignService signService;

    @Autowired
    private UserInfoService userInfoService;

    //根据userId查询数据@PathVariable("userId")
    @GetMapping("query")
    //@PathVariable是用来对指定请求的URL路径里面的变量
    public Dto query(int userId){
        //将当前用户签到状态默认为2，已签到
        int isSign = 2;
        // 获取时间加一年或加一月或加一天
        Date nowDate = new Date();
        // 设置时间格式为：年-月-日
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Sign sign2 = new Sign();
        SignVo signVo = new SignVo();

        /*判断数据是否有数据，如果没有数据增加数据*/
        if (signService.query(userId) == null){
            sign2.setSignCount(1);
            sign2.setSignDays(sdf.format(nowDate));
            sign2.setSignHistory(1);
            sign2.setLastModificationTime(nowDate);
            signVo.setFraction(1);
            sign2.setUserId(userId);

            //判断用户的签到数据是否插入成功
            if(signService.insert(sign2) ==1){
                //首先对用户签到状态进行更改，改为已签到
                signService.updUserSgin(isSign,userId);
            }
            Sign signDtoDate = signService.query(sign2.getUserId());
            signVo.setSignCount(signDtoDate.getSignCount());
            signVo.setLastModificationTime(signDtoDate.getLastModificationTime());
            signVo.setImtrgration(signDtoDate.getImtrgration());
            return DtoUtil.returnSuccess(signVo);
        }else {
            /*如果有数据更改数据*/
            //先查询数据
            sign2 = signService.nestedQueries(userId);

            /*再进行签到更改数据*/
            sign2.setSignCount(sign2.getSignCount() + 1);
            //sign2.getSignDays()原数据，用"，"分开，sdf.format(nowDate)传入签到时间数据
            /*
            为什么用"，"分开？
            方便将数据分隔，表示数据的不同
             */
            sign2.setSignDays(sign2.getSignDays() + "," + sdf.format(nowDate));
            sign2.setSignHistory(sign2.getSignHistory() + 1);
            sign2.setLastModificationTime(nowDate);
            //sign2.setImtrgration(sign2.getImtrgration() + 1);

            /*
                积分
                    根据用户签到的天数进行判断，
            */
            /*当userinfo表中的permissionId为1时，则是普通用户，每天加普通积分*/
            if (sign2.getPermissionId()==1) {
                //当普通用户连续签到大于等于0，小于7时，积分每天加一分
                if (sign2.getSignCount() >= 0 && sign2.getSignCount() < 7) {
                    sign2.setImtrgration(sign2.getImtrgration() + 1);
                    //将每天只加一分的数据，传到前台
                    signVo.setFraction(1);

                    //当普通用户连续签到大于等于7，小于15时，积分每天加三分
                } else if (sign2.getSignCount() >= 7 && sign2.getSignCount() < 15) {
                    sign2.setImtrgration(sign2.getImtrgration() + 3);
                    //将每天只加三分的数据，传到前台
                    signVo.setFraction(3);

                    //当普通用户连续签到大于等于15，小于21时，积分每天加五分
                } else if (sign2.getSignCount() >= 15 && sign2.getSignCount() < 21) {
                    sign2.setImtrgration(sign2.getImtrgration() + 5);
                    //将每天只加五分的数据，传到前台
                    signVo.setFraction(5);

                    //当普通用户连续签到大于等于21，小于28时，积分每天加七分
                } else if (sign2.getSignCount() >= 21 && sign2.getSignCount() < 28) {
                    sign2.setImtrgration(sign2.getImtrgration() + 7);
                    //将每天只加七分的数据，传到前台
                    signVo.setFraction(7);

                    //当普通用户连续签到大于等于28时，积分每天加十分
                } else {
                    sign2.setImtrgration(sign2.getImtrgration() + 10);
                    //将每天只加十分的数据，传到前台
                    signVo.setFraction(10);
                }
            /*当userinfo表中的permissionId不为1时，则是vip用户，每天加vip积分*/
            }else {
                //当vip用户连续签到大于等于0，小于7时，积分每天加三分
                if (sign2.getSignCount() >= 0 && sign2.getSignCount() < 7) {
                    sign2.setImtrgration(sign2.getImtrgration() + 3);
                    //将每天只加三分的数据，传到前台
                    signVo.setFraction(3);

                    //当vip用户连续签到大于等于7，小于15时，积分每天加五分
                } else if (sign2.getSignCount() >= 7 && sign2.getSignCount() < 15) {
                    sign2.setImtrgration(sign2.getImtrgration() + 5);
                    //将每天只加五分的数据，传到前台
                    signVo.setFraction(5);

                    //当vip用户连续签到大于等于15，小于21时，积分每天加七分
                } else if (sign2.getSignCount() >= 15 && sign2.getSignCount() < 21) {
                    sign2.setImtrgration(sign2.getImtrgration() + 7);
                    //将每天只加七分的数据，传到前台
                    signVo.setFraction(7);

                    //当vip用户连续签到大于等于21，小于28时，积分每天加九分
                } else if (sign2.getSignCount() >= 21 && sign2.getSignCount() < 28) {
                    sign2.setImtrgration(sign2.getImtrgration() + 9);
                    //将每天只加九分的数据，传到前台
                    signVo.setFraction(9);

                    //当vip用户连续签到大于等于28时，积分每天加十二分
                } else {
                    sign2.setImtrgration(sign2.getImtrgration() + 12);
                    //将每天只加十二分的数据，传到前台
                    signVo.setFraction(12);
                }
            }

            if(signService.signUpdate(sign2) == 1){
                //查询信息
                Sign signInfo = signService.nestedQueries(sign2.getUserId());
                //获取最后修改时间
                String lastTime = sdf.format(signInfo.getLastModificationTime());
                //获得当前时间
                String thisTime = sdf.format(nowDate);
                //这个的逻辑是，如果最后签到日与当日相等，判断当日用户已签到，如果不是则未签到
                //判断最后修改时间和当前时间是否相等
                if (!(lastTime.equals(thisTime))) {
                    //不等于，将isSign改为1，未签到
                    isSign = 1;
                    //调用接口进行修改
                    signService.updUserSgin(isSign, sign2.getUserId());
                } else {
                    //如果等于，为已签到
                    signService.updUserSgin(isSign, sign2.getUserId());
                }
                Sign signDtoDate = signService.query(sign2.getUserId());
                signVo.setSignCount(signDtoDate.getSignCount());
                signVo.setLastModificationTime(signDtoDate.getLastModificationTime());
                signVo.setImtrgration(signDtoDate.getImtrgration());
                //如果用户更改数据成功那么再次执行查询数据库，将更改后的数据查询返回到前端
                return DtoUtil.returnSuccess(signVo);
            }else{
                //说明数据库更改数据未成功
                System.out.println("更改数据库未成功");
                return DtoUtil.returnError(5001,"未能获取到签到相关数据");
            }

        }
    }

    //根据userId更改数据
    @PostMapping("signUpdate")
    public Dto signUpdate(@RequestBody Sign sign){
        return  null;
    }

    //根据userinfo表中的id和sign表中的userId连接两个表，并查询两个表中的数据
    @GetMapping("nestedQueries")
    public Dto nestedQueries(int userId){
        // 获取时间加一年或加一月或加一天
        Date nowDate = new Date();
        // 设置时间格式为：年-月-日
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Sign sign = new Sign();
        //查询数据库数据
        sign = signService.nestedQueries(userId);
        //对时间Date进行加减运算操作
        Calendar rightNow = Calendar.getInstance();
        //对当前日期传入Calendar类进行处理
        rightNow.setTime(new Date());
        //对当前日期进行运算，-1即对当前日期减去一天
        rightNow.add(Calendar.DAY_OF_MONTH,-1);
        //获取昨天的时间                   getTime()获得运算后的日期
        String yesterday = sdf.format(rightNow.getTime());
        //查询信息
        Sign signInfo = signService.nestedQueries(sign.getUserId());
        //获取最后修改时间
        String lastTime = sdf.format(signInfo.getLastModificationTime());
        //获得当前时间
        String thisTime = sdf.format(nowDate);
        /*先判断有没有断签*/
        //判断最后修改时间是不是等于昨天的时间，并且判断最后修改时间是不是等于今天的时间
        if (!(lastTime.equals(yesterday))&&!(lastTime.equals(thisTime))) {
            //如果不是，则用户断签了,将连续签到的天数改为0
            signService.zero(userId);
        } else {
            //如果是，则用户没有断签，查询数据
            signService.nestedQueries(userId);
        }
        /*再判断今天有没有签到*/
        //将当前用户签到状态默认为2，已签到
        int isSign = 2;
        //这个的逻辑是，如果最后签到日与当日相等，判断当日用户已签到，如果不是则未签到
        //判断最后修改时间和当前时间是否相等
        if (!(lastTime.equals(thisTime))) {
            //不等于，将isSign改为1，未签到
            isSign = 1;
            //调用接口进行修改
            signService.updUserSgin(isSign, sign.getUserId());
        } else {
            //如果等于，为已签到
            signService.updUserSgin(isSign, sign.getUserId());
        }
        /*每个月一号，将数据库的已签到天数和签到历史更改为初始值*/
        //获取当月一号的时间
        Calendar calendar1=Calendar.getInstance();
        calendar1.set(Calendar.DAY_OF_MONTH, 1);
        String firstMonth = sdf.format(calendar1.getTime());
        System.out.println("本月第一天: "+sdf.format(calendar1.getTime()));
        /*判断当前时间是不是等于本月一号*/
        if((thisTime.equals(firstMonth))) {
            //获取当前用户的id
            sign.setUserId(userId);
            //如果是，将已签到天数改为null，签到历史改为0
            sign.setSignDays(null);
            sign.setSignHistory(0);
            //每月一号将数据库的已签到天数和签到历史清空
            signService.empty(sign);
        }
        return DtoUtil.returnSuccess(signService.nestedQueries(userId));
    }


}